package Day011_多线程1.demo05_原子类;

import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 * @author zhangyan
 * @date 2020/4/28 14:36
 */
public class demo03_AtomicIntegerArray {
    public static void main(String[] args) throws InterruptedException {

        //创建并启动10000条线程,每条线程都对数组的每一个元素都自增1
        //主线程循环10000次,run方法执行了10000次,数组自增10000次
        for (int i = 0; i < 10000; i++) {
            MyThread1 mt = new MyThread1();
            mt.start();
        }

        //保证主线程 子线程执行完毕,再循环打印
        Thread.sleep(5000);
        //打印每个元素,按道理每个元素都是10000
        for (int i = 0; i < MyThread1.arr.length(); i++) {
            System.out.println(MyThread1.arr.get(i)); //获取数组元素
        }
        // 原子性问题: 结果9996 9997 9998 9997.....10000.....9996.....
        // 使用原子类: 10000 10000 ......
    }
}

class MyThread1 extends Thread {
    //static int[] arr = new int[100]; //100个0

    //使用原子类int数组 AtomicIntegerArray
    static AtomicIntegerArray arr = new AtomicIntegerArray(1000);

    @Override
    public void run() {
        //对数组中的每个数据自增1
        for (int i = 0; i < arr.length(); i++) {
            arr.addAndGet(i, 1); // 数组元素自增1
        }
        System.out.println("子线程执行完毕");
    }
}
